草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 自制迭代器的常量正确性

总体目标我管理一个对象集合(CollectionofReal作为一个简单的例子)。然后我在我的集​​合上定义了迭代器。这意味着:iterator、const_iterator、reverse_iterator和const_reverse_iterator。在这个例子中,我只关注iterator和const_iterator,其他两个非常相似。之后,我想在我的集合上定义一个过滤器,它根据特定条件保留或不保留元素。例如,仅保留具有正值的Real实例。我还想只对保留的元素迭代我的集合。我是如何实现这个集合的对于这个例子,我在集合中的对象非常简单。目标只是拥有一个对象而不是原生类型:struc

c++ - 为什么 gcc 使用我的自定义迭代器优化掉这个 C++11 foreach 循环?

我正在尝试编写一些代码来创建序列的函数式样式。我写了一个函数,range(a,b),它返回一个你可以迭代的对象,foreach风格,遍历数字a,a+1,...,b-1.然后我写了另一个函数map(f,t),它返回另一个可迭代对象,其中序列中的每个元素都是用相应元素调用f的结果可迭代对象t.如果我使用-O1或更低版本进行编译,这将按预期工作;使用-O2或更高版本时,我的foreach循环(在底部的main中)得到完全优化并且没有打印任何内容。为什么会这样,我做错了什么?这是我的代码:templatestruct_range{Ta;Tb;_range(Ta,Tb):a(a),b(b){}s

c++ - 我将如何在 C++20 中传递范围而不是迭代器对?

我听说C++20将支持作用于范围,而不仅仅是开始+结束迭代器对。这是否意味着,在C++20中,我将能够编写:std::vectorvec=get_vector_from_somewhere();std::sort(vec);std::vectorhalves;halves.reserve(vec.size());std::transform(vec,std::back_inserter(halves),[](intx){returnx*0.5;});? 最佳答案 几乎,是的!您只需要使用std::ranges::命名空间而不仅仅是s

c++ - std::list 上的 splice() 和迭代器失效

list::splice()的三参数形式将单个元素从一个列表移动到另一个列表。SGI'sdocumentation明确声明所有迭代器,包括指向被移动元素的迭代器仍然有效。Roguewave'sdocumentation没有说明splice()方法的迭代器失效属性,而C++标准明确指出它会使所有迭代器和对被拼接元素的引用失效。splicing()在实践中按照SGI的定义工作,但我在Microsoft的STL实现(严格遵循标准的字母)的调试/安全SCL版本中遇到断言失败(取消引用无效迭代器)。现在,我使用列表正是因为我想在列表之间移动一个元素,同时保持指向它的迭代器的有效性。该标准对原始S

c++ - std::list::clear 是否使 std::list::end 迭代器无效?

检查这段代码:#include"stdafx.h"#includeint_tmain(intargc,_TCHAR*argv[]){std::listmylist;mylist.push_back(1);std::list::iteratori=mylist.end();if(i==mylist.end())printf("endisend\n");mylist.clear();if(i==mylist.end())printf("nevergetherebecauseMicrosoftseemsto""thinktheiteratorisnolongersafe.\n");retur

c++ - C++ 迭代器的生命周期和有效性是多少?

我计划用C++实现一个事物列表,其中的元素可能会被乱序删除。我不希望我需要任何类型的随机访问(我只需要定期扫描列表),而且项目的顺序也不重要。所以我想到了std::listwiththis->position=insert(lst.end(),thing)应该可以解决问题。我希望Thing类记住每个实例的位置,以便以后可以轻松地执行lst.erase(this->position)在常数时间内。但是,我对C++STL容器还是有点陌生​​,我不知道将迭代器保存这么长时间是否安全。特别是考虑到在插入的Thing消失之前和之后还会有其他元素被删除。 最佳答案

c++ - STL迭代器相等性是如何建立的?

我想知道,STL迭代器的相等性(==)是如何建立的?它是简单的指针比较(因此基于地址)还是更花哨的东西?如果我有来自两个不同列表对象的两个迭代器并比较它们,结果是否总是错误的?如果我将一个有效值与超出范围的值进行比较怎么办?这总是错误的吗? 最佳答案 如果需要,迭代器类可以定义重载的==运算符。所以结果取决于operator==的实现。您真的不应该比较来自不同容器的迭代器。我认为如果您这样做,一些调试STL实现会发出警告信号,这将帮助您在代码中发现这种错误使用情况。 关于c++-STL迭

c++ - 为什么范围的算法与 std 的迭代器不兼容?

#include#include#includeintmain(){autocoll=std::vector{1,2,3};ranges::copy(coll,ranges::ostream_iterator{std::cout,","});//okranges::copy(coll,std::ostream_iterator{std::cout,","});//error}上面的代码显示了这个问题。我用ranges-v3-0.3.7.对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可。如果是这样,为什么范围的算法与std的迭代器不兼容?

c++ - 以迭代方式复制二叉树

我在一次采访中被问到这个问题,这让我丢掉了一份工作:P面试官问,你会得到一棵树的根,你必须将根返回到复制的树,但复制应该以迭代的方式进行。我在这里粘贴我的代码,我在那里写了同样的代码,它工作正常。我最初使用两个堆栈来做这个,面试官说他不喜欢,然后我用下面的方式做了。面试官对我使用另一种包含指向原始树和最终树的指针的结构感到有点不高兴(引用代码)。我想知道是否还有其他更好的方法来做到这一点??structnode{intdata;structnode*left;structnode*right;};structcopynode{node*original;node*final;};nod

c++ - unordered_map 中迭代器的效率 (C++)

我似乎找不到这方面的任何信息,所以我求助于stackoverflow。C++中std::tr1::unordered_map的迭代器效率如何?特别是与列表迭代器相比。制作一个包装类是否有意义,该包装类也将所有键保存在列表中以允许高效迭代(我的代码确实对unordered_map中的键使用了大量迭代)。对于那些会推荐boost的人,我不能使用它(无论出于何种原因)。 最佳答案 我没有检查TR1,但N3035(C++0x草案)是这样说的:Allthecategoriesofiteratorsrequireonlythosefunctio